package sde.actor.csm;
import java.io.*;

import sde.actor.*;
import sde.actor.csm.IStazione.Init;
import sde.actor.distribution.*;

import java.util.*;

public class CSM {
	public static void main( String[] args ) throws IOException{
		//Argomenti attesi, nell'ordine:
		//tempoLimite nClienti (Exp)mu0 (Exp)mu1 (Exp)mu2 
		//(HyperExp)mu31 m32 a31 a32 (Erlang)n4 mu4 q0 q2 q3 q4 
		//(file)f1 f2 f3 f4 fS
//		if( args.length!=20 ){
//			System.out.println(args.length+" numero argomenti errato!");
//			System.exit(-1);
//		}
		int tempoLimite = (int) (3*Math.pow(10, 7));
		int nClienti = 20;

		double mu0 = 0.01;
		double mu1 = 1;
		double mu2 = 0.8;
		double mu31 = 5;
		double mu32 = 0.5;
		double a31 = 0.95;
		double a32 = 0.05;
		int n4 = 16;
		double mu4 = 0.6;
		double q0 = 0.2;
		double q2 = 0.3;
		double q3 = 0.2;
		double q4 = 0.3;	
		String f1 = "C:\\Users\\Valerio\\Desktop\\sistema.txt";
		String f2 = "C:\\Users\\Valerio\\Desktop\\stazione1.txt";
		String f3 = "C:\\Users\\Valerio\\Desktop\\stazione2.txt";
		String f4 = "C:\\Users\\Valerio\\Desktop\\stazione3.txt";
		String fs = "C:\\Users\\Valerio\\Desktop\\stazione4.txt";
	 
		Osservatore os0 = new OsservatoreSistema( tempoLimite, fs );
		Osservatore os1 = new OsservatoreStazione( tempoLimite, f1 );
		Osservatore os2 = new OsservatoreStazione( tempoLimite, f2 );
		Osservatore os3 = new OsservatoreStazione( tempoLimite, f3 );
		Osservatore os4 = new OsservatoreStazione( tempoLimite, f4 );

		Random g = new Random( 2707L );
		
		//creazione distribuzioni
		Distribution d0 = new ExponentialDistribution( mu0, g );
		Distribution d1 = new ExponentialDistribution( mu1, g );
		Distribution d2 = new ExponentialDistribution( mu2, g );
		double []mu3 = { mu31, mu32 };
		double []alfa3 = { a31, a32 };
		Distribution d3 = new HyperexponentialDistribution( alfa3, mu3, g );
		Distribution d4 = new ErlangDistribution( n4, mu4, g );
		
		ControlMachine cm=new Simulation( tempoLimite );
		
		//creazione stazioni
		Stazione s0 = new StazioneRiflessione();
		s0.send( new IStazione.Init( d0, os0 ) );
		Stazione s1 = new Stazione();
		s1.send( new IStazione.Init(d1, os1) );
		Stazione s2 = new Stazione();
		s2.send( new IStazione.Init( d2, os2) );
		Stazione s3 = new Stazione();
		s3.send( new IStazione.Init( d4, os3 ) );
		Stazione s4 = new Stazione();
		s4.send( new IStazione.Init( d3, os4 ) );
		
		Stazione []s = { s0, s2, s3, s4 };
		double []q = { q0, q2, q3, q4 };
		Router router = new Router( s, q, g );
		
		//creazione collegamenti
		s0.setProssimaStazione( s1 );
		s1.setProssimaStazione( router );
		s2.setProssimaStazione( s1 );
		s3.setProssimaStazione( s1 );
		s4.setProssimaStazione( s1 );
		
		//creazione popolazione clienti - ricircolanti
		for( int i=0; i<nClienti; i++ ){
			//cliente # i
			Cliente c=new Cliente( i );
			IStazione.Arrival a=new IStazione.Arrival( c );
			//invia arrivo a alla stazione di riflessione
			s0.send( a );
		}

		cm.controller();
		
		//salva risultati
		os0.salva();
		os1.salva();
		os2.salva();
		os3.salva();
		os4.salva();
	}//main
	
}//CSM

